/**
 *\file mainConsoleMulti.c
 *\author Raphaël Diana
 */
#include "maison.h"

void effacerEcran()
{
    int i;
    for(i=0; i<30; i++)
    {
        printf("\n");
    }
}

/* ---------------------------------------------- JEU ----------------------------------------------*/

void Mise(Joueur * j,int indmain)
{
    int mise=-1;
    printf("\n-------- Entrez une mise entre 0 & 300 pour la case %d --------\n", (int)indmain/4+1);
    do
    {
        scanf("%d",&mise);

    }
    while(getchar()!='\n' || (mise<0 || mise>300 || mise>testCreditJoueur(j)));

    placeMise(j,mise,indmain);
    printf("   Credit actualise : %d\n\n", testCreditJoueur(j));
}

void tableCroupier(Maison* maison, int tour)
{
    int i, j;
    printf("|");
    for(j=0; j<29; j++)
    {
        printf(" ");
    }
    printf("-Main du croupier-");
    for(j=0; j<28; j++)
    {
        printf(" ");
    }
    printf("|\n");

    if(tour==1)
    {
        printf("|");
        for(j=0; j<29; j++)
        {
            printf(" ");
        }
        if(getCarte(getListeMaison(maison), 1)!=NULL)
        {
            afficherCarte(getCarte(getListeMaison(maison), 1));

        }
        else
        {
            for(j=0; j<17; j++)
            {
                printf(" ");
            }
        }
        for(j=0; j<29; j++)
        {
            printf(" ");
        }
        printf("|\n");
    }
    else
    {
        if(tour==2)
        {
            i=1;
            while(getCarte(getListeMaison(maison), i)!=NULL)
            {
                printf("|");
                for(j=0; j<29; j++)
                {
                    printf(" ");
                }
                if(getCarte(getListeMaison(maison), i)!=NULL)
                {
                    afficherCarte(getCarte(getListeMaison(maison), i));
                }
                else
                {
                    for(j=0; j<17; j++)
                    {
                        printf(" ");
                    }
                }
                i++;
                for(j=0; j<29; j++)
                {
                    printf(" ");
                }
                printf("|\n");
            }
        }
        else
        {
            printf("|");
            for(j=0; j<75; j++)
            {
                printf(" ");
            }
            printf("|\n");
        }
    }
}

void tableJoueur(Joueur* joueur)
{
    int i, j, l, n;
    i=1;
    while(testMiseCase(joueur, 0)+testMiseCase(joueur, 4)+testMiseCase(joueur, 8)!=0
            && (getCarte(getListeJoueur(joueur, 0), i)!=NULL
                || getCarte(getListeJoueur(joueur, 4), i)!=NULL
                || getCarte(getListeJoueur(joueur, 8), i)!=NULL))/*si le joueur a au moins miser sur une case*/
    {
        printf("|");
        for(j=8; j>=0; j-=4)/*affichage des cases de gauche a droite*/
        {
            for(l=0; l<6; l++)
            {
                printf(" ");
            }
            if(testMiseCase(joueur, j)>0 && getCarte(getListeJoueur(joueur, j), i)!=NULL)
            {
                afficherCarte(getCarte(getListeJoueur(joueur, j), i));
            }
            else
            {
                for(l=0; l<17; l++)
                {
                    printf(" ");
                }
            }
        }
        i++;
        for(l=0; l<6; l++)
        {
            printf(" ");
        }
        printf("|\n");
    }
    printf("|");

    for(l=0; l<75; l++)
    {
        printf(" ");
    }
    printf("|\n");
    /*affichage main séparées*/

    for(n=1; n<4; n++)/*toutes les separations possibles*/
    {
        i=1;
        while(testMiseCase(joueur, 0+n)+testMiseCase(joueur, 4+n)+testMiseCase(joueur, 8+n)!=0
                && (getCarte(getListeJoueur(joueur, 0+n), i)!=NULL
                    || getCarte(getListeJoueur(joueur, 4+n), i)!=NULL
                    || getCarte(getListeJoueur(joueur, 8+n), i)!=NULL))/*si le joueur a au moins miser,sur une case*/
        {
            printf("|");
            for(j=8; j>=0; j-=4)/*affichage des cases de gauche a droite*/
            {
                for(l=0; l<6; l++)
                {
                    printf(" ");
                }
                if(testMiseCase(joueur, j+n)>0 && getCarte(getListeJoueur(joueur, j+n), i)!=NULL)
                {
                    afficherCarte(getCarte(getListeJoueur(joueur, j+n), i));
                }
                else
                {
                    for(l=0; l<17; l++)
                    {
                        printf(" ");
                    }
                }
            }
            i++;
            for(l=0; l<6; l++)
            {
                printf(" ");
            }
            printf("|\n");
        }
        printf("|");

        for(l=0; l<75; l++)
        {
            printf(" ");
        }
        printf("|\n");
    }

}

void afficherTable(Maison* maison, Joueur* joueur, int tour)
{
    int j, k, l, m;

    printf("|");
    for(j=0; j<75; j++)
    {
        printf("=");
    }
    printf("|\n");
    printf("|");
    printf(" Min: 0$ Max: 300$");
    for(j=0; j<57; j++)
    {
        printf(" ");
    }
    printf("|\n");
    tableCroupier(maison, tour);
    for(k=0; k<8; k++)
    {
        printf("|");
        switch(k)
        {
        case 1:
            for(j=0; j<26; j++)
            {
                printf(" ");
            }
            printf("BLACKJACK PAIE 3 POUR 2");
            for(j=0; j<26; j++)
            {
                printf(" ");
            }
            break;
        case 2:
            for(j=0; j<21; j++)
            {
                printf(" ");
            }
            printf("La banque tire a 16 et reste a 17");
            for(j=0; j<21; j++)
            {
                printf(" ");
            }
            break;
        case 3:
            for(j=0; j<26; j++)
            {
                printf(" ");
            }
            printf("-----------------------");
            for(j=0; j<26; j++)
            {
                printf(" ");
            }
            break;
        case 4:
            for(j=0; j<25; j++)
            {
                printf(" ");
            }
            printf("|Assurance paie 2 pour 1|");
            for(j=0; j<25; j++)
            {
                printf(" ");
            }
            break;
        case 5:
            for(j=0; j<26; j++)
            {
                printf(" ");
            }
            printf("-----------------------");
            for(j=0; j<26; j++)
            {
                printf(" ");
            }
            break;
        case 7:
            for(l=1; l<=3; l++)
            {
                for(m=0; m<6; m++)
                {
                    printf(" ");
                }
                printf("[-----Case %i----]", 4-l);
            }
            for(m=0; m<6; m++)
            {
                printf(" ");
            }
            break;
        default :
            for(j=0; j<75; j++)
            {

                printf(" ");
            }
            break;
        }
        printf("|\n");
    }
    tableJoueur(joueur);

    for(l=0; l<5; l+=2)
    {
        for(j=0; j<l/2; j++)
        {
            printf(" ");
        }
        printf("\\");
        for(j=0; j<75-l; j++)
        {
            printf(" ");
        }
        printf("/\n");
    }
    for(l=0; l<3; l++)
    {
        printf(" ");
    }
    printf("|");
    for(j=0; j<69; j++)
    {
        printf("=");
    }
    printf("|\n");
}

int choixJoueur(Maison* maison, Joueur* joueur, int i, int j)
{
    int finTirage, choix, k;
    finTirage=0;
    while(finTirage!=1)
    {
        choix=0;
        if(j<2 && testSeparerListe(getListeJoueur(joueur, i)))/*si la main peut etre separee on propose le choix*/
        {
            while(finTirage!=1)
            {
                choix=0;
                while(choix<1 || choix>2)
                {
                    printf("Souhaitez vous : [ Separer votre main (1) ||  Jouer votre main (2) ]\n");
                    scanf("%d",&choix);
                    while(getchar() != '\n');/*vidage buffer*/
                }
                switch(choix)
                {
                case 1:
                    printf("Vous separez votre main.\n");
                    if(getIndiceCase(joueur, i)<=3)
                    {
                        k=2;
                    }
                    else
                    {
                        k=1;
                    }
                    separationListe(joueur, maison, i);
                    effacerEcran();
                    afficherTable(maison, joueur, 1);
                    printf(" Case %i :\n", i/4+1);
                    printf("  Valeur de votre main =%u\n\n", getValeurMain(getListeJoueur(joueur, i)));
                    effacerEcran();
                    afficherTable(maison, joueur, 1);
                    printf(" Case %i :\n", i/4+1);
                    printf("  Valeur de votre main =%u\n\n", getValeurMain(getListeJoueur(joueur, i)));
                    j=choixJoueur(maison, joueur, i, j+1);/*on joue la premiere main resultant de la separation*/
                    effacerEcran();
                    afficherTable(maison, joueur, 1);
                    printf(" Case %i :\n", i/4+1);
                    printf("  Valeur de votre main =%u\n\n", getValeurMain(getListeJoueur(joueur, i+k)));
                    choixJoueur(maison, joueur, i+k, j);/*on joue la seconde main issue de la separtion*/
                    finTirage=1;
                    break;

                case 2:
                    printf("Vous jouez votre main.\n");
                    choixJoueur(maison, joueur, i, 4);/*on joue la main normalement*/
                    finTirage=1;
                    break;

                default:
                    printf("!!!!!!!!!!!!!ERREUR TIRAGE SEPARATION!!!!!!!!!!!!");
                    finTirage=1;
                    break;
                }
            }
        }
        else
        {
            while(choix<1 || choix>3)
            {
                printf("Souhaitez vous : [ Tirer une carte (1) ||  Doubler la mise (2) || Rester (3) ]\n");
                scanf("%d",&choix);
                while(getchar() != '\n');/*vidage buffer*/
            }
            switch(choix)
            {
            case 1:
                printf("Vous demandez une carte.\n");
                piocherCarte(joueur->jeu[i].hand, maison);
                effacerEcran();
                afficherTable(maison, joueur, 1);
                if(joueur->jeu[i].assurance!=0)printf("\nAssurance = %1.f\n", joueur->jeu[i].assurance);
                printf(" Case %i :\n", i/4+1);
                printf("  Valeur de votre main = %u\n", getValeurMain(joueur->jeu[i].hand));
                finTirage=(getValeurMain(joueur->jeu[i].hand)>=21);/* on propose le tirage jusqu'a ce que le joueur obtienne un natural(21 en 3 cartes) ou saute*/
                break;

            case 2:
                printf("Vous doublez votre mise.\n");
                doubleMise(joueur,i);
                piocherCarte(joueur->jeu[i].hand,maison);
                effacerEcran();
                afficherTable(maison, joueur, 1);
                if(joueur->jeu[i].assurance!=0)printf("\nAssurance = %1.f\n", joueur->jeu[i].assurance);
                printf(" Case %i :\n", i/4+1);
                printf("  Valeur de votre main =%u\n\n", getValeurMain(joueur->jeu[i].hand));
                finTirage=1;
                break;


            case 3:
                printf("Vous restez.\n\n");
                finTirage=1;
                break;

            default:
                printf("!!!!!!!!!!!!!ERREUR TIRAGE!!!!!!!!!!!!");
                finTirage=1;
                break;
            }
        }
    }
    return j;
}


void tourJoueur(Maison* maison, Joueur* joueur)
{
    int i;
    effacerEcran();
    afficherTable(maison, joueur, 1);

    for(i=0; i<11; i+=4)
    {
        if(testMiseCase(joueur, i)>0)/* si le joueur n'a pas miser ou si il a un Blackjack on ne lui propose pas d'action*/
        {
            proposerAssurance(maison, joueur, i);
            effacerEcran();
            afficherTable(maison, joueur, 1);
            if(testBlackjack(getListeJoueur(joueur, i)))
            {
                printf("  BLACKJACK ! case %i\n\n", i/4+1);
            }
            else
            {
                printf(" Case %i :\n", i/4+1);
                printf("  Valeur de votre main = %u\n\n", getValeurMain(joueur->jeu[i].hand));
                choixJoueur(maison, joueur, i, 0);
            }
        }
        effacerEcran();
        afficherTable(maison, joueur, 1);
    }
}/* A la fin du tour du joueur toutes ses cartes ont etees servies*/

void tourMaison(Maison* maison, Joueur* joueur)
{
    int j;
    tirageMaison(maison, 17);
    effacerEcran();
    afficherTable(maison, joueur, 2);
    if(testBlackjack(getListeMaison(maison)))
    {
        printf("BLACKJACK de la banque!\n\n");
    }
    else
    {
        printf("  Valeur de la main de la banque = %u\n\n", getValeurMain(maison->handMaison));
    }
    for(j=0; j<12; j++)
    {
        if(testMiseCase(joueur, j)!=0)
        {
            printf("\n----- Resultat main %u -----\n", joueur->jeu[j].indice);
            if(testBlackjackCase(joueur, j))
            {
                printf("\nVous avez un Blackjack!\nVous etes paye a 3 pour 2\n");
            }
            else
            {
                switch(gagneListe(joueur, maison, j))
                {
                case 1:
                    printf("\nVous gagnez! La banque paye 1 pour 1\n");
                    break;
                case 0:
                    printf("\nLa banque gagne.\n");
                    break;
                case -1:
                    printf("\nEgalite. Remboursement de votre mise.\n");
                    break;
                default:
                    printf("\nERREUR RESULTAT\n");
                    break;
                }
            }
            payerJoueur(maison, joueur, j);
        }
    }
}

char* continuerQuitter(char* continuer, Joueur* joueur)
{
    *continuer='f';
    while(*continuer!='c' && *continuer!='q')
    {
        printf("\nVoulez vous continuer la partie? [c] ou quitter la table? [q]\n");
        *continuer = getchar() | 0x20;
        while(getchar()!='\n');
    }
    switch(*continuer)
    {
    case 'c':
        printf("\nVous avez choisi de continuer.\n\n");
        break;
    case 'q':

        printf("\nVous avez choisi de quitter. Votre gain est de %.1f$\n\n", joueur->credit-2000);
        break;
    default:
        printf("\nERREUR SAISIE.\n\n");
        break;
    }
    return continuer;
}

void play()
{
    Maison * maison;
    Joueur * joueur;
    char continuer;
    int manche, i, credit;
    manche=0;
    continuer='f';
    joueur=creerJoueur();
    initJeuJoueur(joueur);
    maison=initMaison();
    maison->handMaison=initListe();
    crediteJoueur(joueur, 2000);
    /*structure et credit initialise*/
    /*test separation profondeur*/
    for(i=2; i<12; i++)
    {
        iemeCellule(maison->sabot->talon, i)->info=&maison->sabot->jeuCarte[10];
    }
    /*fin test separation profondeur*/
    while(testCreditJoueur(joueur)>0.5 && continuer!='q' && getNombreElement(maison->sabot->talon)>=52)/*condition de fin de jeu*/
    {
        if(manche!=0)/*Réinitialisation de la table après chaque donne*/
        {
            testamentListe(&maison->handMaison);
            testamentJeuJoueur(joueur);
            initJeuJoueur(joueur);
            maison->handMaison=initListe();
        }
        effacerEcran();
        afficherTable(maison, joueur, 1);
        printf("   Credit actuel : %d\n", testCreditJoueur(joueur));
        credit=testCreditJoueur(joueur);

        for(i=0; i<3; i++)/*Demande au joueur de miser sur des case*/
        {
            Mise(joueur, 4*i);
        }
        if(credit==testCreditJoueur(joueur))/*si le joueur n'a rien miser on quitte le jeu*/
        {
            continuer='q';
        }
        else/*sinon on poursuit le jeu normalement*/
        {
            manche++;
            distribuerCarte(maison, joueur);/*sert les cartes sur les cases ou il y a une mise et la maison*/
            /*test assurance*/
            /*maison->handMaison->ad->info=&maison->sabot->jeuCarte[12];*/
            /*fin test assurance*/
            effacerEcran();
            afficherTable(maison, joueur, 1);
            tourJoueur(maison, joueur);/*le joueur joue sur les case ou il a miser*/
            printf("\nTour Joueur termine\n");

            tourMaison(maison, joueur);
            printf("\nTour Maison termine\n");
            continuerQuitter(&continuer, joueur);
        }
    }
    detruireMaison(&maison);
    if(testCreditJoueur(joueur)<=0.5)
    {
        printf("\n Vous n'avez plus de jetons veuillez quitter la table\n");
    }
    testamentJoueur(&joueur);
    printf("\nA bientot\n\n");
}


/* ---------------------------------------------- FIN JEU ----------------------------------------------*/

int main()
{
    play();

    return 0;
}
